﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace pictureAnalyse
{
    /// <summary>
    /// 定义Point，用于记录坐标位置
    /// </summary>
    public class Point
    {
        public int x=0, y=0;
        public Point(int x=0, int y=0)
        { 
            this.x = x;
            this.y = y;
        }

        /// <summary>
        /// 从字符串形式坐标构建
        /// </summary>
        public Point(String PointStr)
        {
            String[] A = PointStr.Split('_');
            this.x = Int32.Parse(A[0]);
            this.y = Int32.Parse(A[1]);
        }

        /// <summary>
        /// 转化为字符串形式
        /// </summary>
        public String ToString()
        {
            return x + "_" + y;
        }

        /// <summary>
        /// 向量叠加
        /// </summary>
        public Point Add(Point P)
        {
            return new Point(this.x + P.x, this.y + P.y);
        }

        /// <summary>
        /// 向量叠加
        /// </summary>
        public Point Add(int x, int y)
        {
            return new Point(this.x + x, this.y + y);
        }

        /// <summary>
        /// 复制当前Point
        /// </summary>
        public Point clone()
        {
            return new Point(this.x, this.y);
        }
    }

    /// <summary>
    /// 方向指针，记录当前检索的方向变量
    /// </summary>
    class Orientation
    {
        // x,y 表示8个方向
        private int[] x = { 1, 1, 0, -1, -1, -1, 0, 1 };
        private int[] y = { 0, 1, 1, 1, 0, -1, -1, -1 };

        // 记录0到7共八个方向
        private int oren = 0;

        /// <summary>
        /// 创建指定方向的方向指针
        /// </summary>
        public Orientation(int oren=0)
        {
            this.oren = oren;
        }

        /// <summary>
        /// 移动至下一个方向
        /// </summary>
        public void toNext()
        {
            if (++oren == 8) oren = 0;
        }

        /// <summary>
        /// 移动至前一个方向
        /// </summary>
        public void toPre()
        {
            if (--oren < 0) oren = 7;
        }

        /// <summary>
        /// 获取当前方向变量
        /// </summary>
        public Point Cur()
        {
            return new Point(x[oren], y[oren]);
        }

        /// <summary>
        /// 指向下一个方向(方向顺时针变动)，并获取方向变量
        /// </summary>
        public Point Next()
        {
            toNext();       // 移动至下一个方向
            return Cur();   // 获取方向向量
        }

        /// <summary>
        /// 指向前一个方向(方向逆时针变动)，并获取方向变量
        /// </summary>
        public Point Pre()
        {
            toPre();        // 移动至前一个方向
            return Cur();   // 获取方向向量
        }

        /// <summary>
        /// 获取下一个方向向量，但不移动至该方向
        /// </summary>
        public Point pekNext()
        {
            Point P = Next();   // 获取下一个方向
            toPre();            // 还原方向
            return P;
        }

        /// <summary>
        /// 获取前一个方向向量，但不移动至该方向
        /// </summary>
        public Point pekPre()
        {
            Point P = Next();   // 获取下一个方向
            toNext();           // 还原方向
            return P;
        }
    }
}
